package empe;

/**
 * Elemento que extende o elemento basico (Cap_elemento) adicionando 
 * um atributo para guardar a referencia de um elemento do tipo
 * evento.
 * Classe responsavel pela gestao da lista de eventos.
 */
public class Tempo extends Cap_elemento {
	
	private Cap_elemento evento;

	public Tempo(int temp) {
		tempo = temp;
		this.evento = null;
	}


	
	/**
	 * Insere um Evento num elemento Tempo, insercao sempre no inicio da lista.
	 * @param novo_ elemento a inserir na lista.
	 */
	protected void insere_evento(Cap_elemento novo_){

		Cap_elemento aux;
		Evento novo = (Evento) novo_; 

	
		if(evento == null) {
			evento = novo;
			novo.anterior = null;
			novo.proximo = null;
		}
		else { /* insere sempre no inicio da lista*/
			aux = evento;
			evento = novo;
			novo.proximo = aux;
			novo.anterior = null;
			aux.anterior=novo;
		}

	}

	
	
	
	/**
	 * Remove Eventos de elementos do tipo Tempo, indicando se o Tempo ficou vazio ou nao,
	 * de modo a que a CAP se possa actualizar correctamente.
	 * @param ev_ referencia do evento a inserir.
	 * @return valor booleano que indica se o Tempo ficou sem eventos.
	 */
	protected boolean remove_evento(Cap_elemento ev_) {

		Evento ev = (Evento) ev_;

		if(ev != null) {
			if(ev.anterior == null) { /*significa que e' o primeiro*/
				this.evento = ev.proximo;
				if(ev.proximo != null) /*salvaguarda o caso em que e' unico*/
					ev.proximo.anterior = null; /*elimina a referência pra ele próprio*/

				ev.proximo = null;
			}
			else {
				if(ev.proximo != null)
					ev.proximo.anterior = ev.anterior;

				ev.anterior.proximo = ev.proximo;

				ev.anterior = ev.proximo = null;

			}

			ev.remove_lista_evento_individuo();
		}

		return esta_vazia();
	}

	
	
	/**
	 * Devolve a referencia guardada no atributo evento.
	 * Deste modo o atributo encontra-se protegido das outras classes
	 * @return referencia do primeiro evento deste Tempo
	 */
	protected Cap_elemento ler_evento() {
		return evento;
	}



	/**
	 * Indica se ainda existem eventos neste Tempo, testando o atributo evento.
	 * @return booleano que indica se o Tempo se encontra vazio ou nao.
	 */
	protected boolean esta_vazia() {

		if(this.evento == null)
			return true;
		else
			return false;	
	}


}
